package main

import "fmt"

type kelvin float64

// sensorClass function type
type sensorClass func() kelvin

func realSensor() kelvin {
	return 0
}

func calibrate(s sensorClass, offset kelvin) sensorClass {
	// s 和 offset 作用域在这里，但是匿名函数里面也捕获到了他俩
	return func() kelvin {
		// 保留外部作用域的变量引用 s 和 offset
		return s() + offset
	}
}

// 闭包
// 因为函数字面值需要保留外部作用域的变量引用，所以函数字面值都是闭包的。
// 将函数作为函数的返回类型

func main() {
	sensor := calibrate(realSensor, 5)
	// 到这一步的时候 虽然calibrate方法走完了。
	// 但是sensor()执行的时候还是能捕获到 s 和 offset这俩变量的
	fmt.Println(sensor())

}
